#ifndef CUSTOMFILEBROWSER_H
#define CUSTOMFILEBROWSER_H

#include <QWidget>
#include <QVBoxLayout>
#include <QMenu>
#include <QAction>
#include <QDateTime>
#include <QFileInfo>
#include <QPointer>
#include <QMutex>
#include <QMap>
#include "customfilelistwidget.h"
#include "layoutstatemanager.h"
#include "filestatusiconmanager.h"
#include "unifiedfileinfo.h"  // For UnifiedFileInfo definition
#include "filelistcontextmenu.h"
#include "globalpagemanager.h"  // Martin Fowler重构：全局页码管理器

// 前向声明
class FileProcessWorker;

/**
 * CustomFileBrowser - 自定义文件浏览器适配器
 * 
 * 将新的CustomFileListWidget包装成与原FileBrowser兼容的接口
 * 实现无缝替换，保持现有代码的兼容性
 * 
 * 设计原则：
 * 1. 保持与FileBrowser相同的公共接口
 * 2. 内部使用CustomFileListWidget实现
 * 3. 处理数据格式转换（UnifiedFileInfo 统一数据格式）
 * 4. 提供相同的信号和槽函数
 */
class CustomFileBrowser : public QWidget
{
    Q_OBJECT

    // 允许CustomFileListWidget访问私有成员
    friend class CustomFileListWidget;

public:
    explicit CustomFileBrowser(QWidget* parent = nullptr);
    ~CustomFileBrowser() override;
    
    // === 兼容FileBrowser的接口 ===
    
    // 文件管理
    void addFile(const QString& filePath);
    void addFiles(const QStringList& filePaths);
    void removeFile(int index);
    void removeFileInternal(int index); // 内部删除方法，不清理缓存
    void clearFiles();
    void selectFile(int index);
    
    // 获取文件信息
    QList<UnifiedFileInfo> getFiles() const;
    UnifiedFileInfo getFile(int index) const;
    int getCurrentIndex() const;
    QString getCurrentFileIdentity() const;
    int getFileCount() const;
    void setCurrentIndex(int index);  // 封装的索引设置方法
    
    // 文件设置
    void updateFileSettings(int index, const UnifiedFileInfo& settings);
    void setGlobalSettings(const UnifiedFileInfo& settings);

    // 设置缓存元数据
    void setProcessedMetadata(int index, const QString& hash, int pages, const QDateTime& latest);

    // === Martin Fowler重构：全局页码连续性支持 ===

    /**
     * @brief 更新文件信息到GlobalPageManager（文件加载、排序时调用）
     * @param fileIdentity 文件唯一标识
     * @param displayPages 显示页数
     */
    void updateGlobalPageMapping(const QString& fileIdentity, int displayPages);

    /**
     * @brief 移除文件信息从GlobalPageManager（文件删除时调用）
     * @param fileIdentity 文件唯一标识
     */
    void removeGlobalPageMapping(const QString& fileIdentity);

    /**
     * @brief 文件排序后重新计算所有页码映射
     */
    void recalculateGlobalPageMappings();

    /**
     * @brief 确保全局页码管理器中的文件顺序与文件浏览器一致
     */
    void ensureGlobalFileOrder();
    
    // 文件查找和更新
    int getFileIndexByIdentity(const QString& fileIdentity) const;
    void updateFileLayoutMode(int index, int layoutMode);
    int calculatePageCountForLayout(int basePageCount, int layoutMode) const;

    // 总页数计算（考虑布局模式）
    int getTotalDisplayPages() const;

    // 选择管理
    QList<int> getSelectedIndices() const;

    // 批量布局操作
    void onSingleColumn();
    void onTwoColumns();
    void onThreeColumns();

    // 显示控制
    void showBrowser();
    void hideBrowser();
    bool isVisible() const;
    
    // 拖拽排序
    void enableDragDrop(bool enable);
    
    // 自适应窗口管理
    void setAdaptiveMode(bool enabled);     // 启用/禁用自适应模式
    bool isAdaptiveMode() const;            // 获取自适应模式状态
    void setMinimumWidth(int width);        // 设置最小宽度
    void setMaximumWidth(int width);        // 设置最大宽度
    
    // 布局模式管理
    void setFileLayoutMode(int index, LayoutMode mode);
    LayoutMode getFileLayoutMode(int index) const;
    void updateFileDisplayAt(int index);
    
    // 主窗口当前显示文件管理
    void setMainWindowCurrentFile(int index);
    int getMainWindowCurrentFile() const;
    
    // 文件状态管理
    void setFileStatus(int index, FileStatusIconManager::FileStatus status, int progress = 0, const QString& statusText = QString());
    void updateFileProgress(int index, int progress, const QString& statusText = QString());
    void setFileCompleted(int index);
    void setFileError(int index, const QString& errorMessage = QString());

    // 基于文件身份的状态管理（排序安全）
    void setFileStatusByIdentity(const QString& fileIdentity, FileStatusIconManager::FileStatus status, int progress = 0, const QString& statusText = QString());
    void updateFileProgressByIdentity(const QString& fileIdentity, int progress, const QString& statusText = QString());
    int findIndexByFileIdentity(const QString& fileIdentity) const;
    QString getFileIdentityByIndex(int index) const;
    void refreshFileIcons();
    
    // === 关键补充：后台任务管理接口 ===
    void registerWorker(const QString& fileIdentity, FileProcessWorker* worker);
    void unregisterWorker(const QString& fileIdentity);
    void cancelWorkerForFile(const QString& fileIdentity);
    int getActiveWorkerCount() const;  // 调试接口：获取活跃worker数量

signals:
    // 保持与FileBrowser相同的信号
    void fileSelected(int index, const UnifiedFileInfo& file);
    void fileRemoved(int index);
    void filesChanged();
    void filesReordered(); // 文件顺序变化信号
    void settingsChanged(int index, const UnifiedFileInfo& settings);
    void exportRequested();
    void previewRequested(int index, const UnifiedFileInfo& file);
    void clearAllRequested();
    void resetProgramRequested();
    void layoutModeRequested(int layoutMode);
    void selectionChanged(const QList<int>& selectedIndices);

    // 新增：总页数变化信号
    void totalDisplayPagesChanged(int totalPages);

    // Martin Fowler重构：导出可用性变化信号（简化Observer模式）
    void exportAvailabilityChanged(bool canExport);

protected:
    void resizeEvent(QResizeEvent* event) override;  // 处理窗口尺寸变化

private slots:
    // === 新的简化信号槽 ===
    void onItemClicked(int index);
    void onItemRightClicked(int index, const QPoint& globalPos);
    void onSelectionChanged(const QList<int>& selectedIndices);
    
    // === Martin Fowler重构：业务逻辑处理方法 ===
    void handleRemoveFiles(const QList<int>& indices);
    void handleMoveToTop(const QList<int>& indices);
    void handleMoveToBottom(const QList<int>& indices);
    void handleExportSingle(int index);
    void handleExportMultiple(const QList<int>& indices);
    void handleExportMerged(const QList<int>& indices);
    void handleSelectAll();              // 处理全选请求
    void handleClearSelection();         // 处理取消选择请求
    void handleNaturalSort(const QList<int>& indices);   // 处理智能排序请求
    void handleReverseSort(const QList<int>& indices);   // 处理反向排序请求
    
    // === 拖拽操作处理（从CustomFileListCoordinator迁移） ===
    void handleDragOperation(const QList<int>& dragIndices, int targetIndex);
    
    // === Martin Fowler重构：统一重排序方法 ===
    void reorderFilesAndUpdateUI(const QList<int>& sourceIndices, int targetIndex);
    
    // === Martin Fowler重构：基于位置信息的排序方法 ===
    void reorderFilesByPosition(const QList<int>& sourceIndices, int targetIndex);
    void refreshUIByPosition(const QList<int>& draggedNewPositions = QList<int>());
    
    // 布局模式变更处理槽函数（复刻原FileBrowser行为）
    void onLayoutModeChanged(const QString& fileIdentity, LayoutMode mode);
    void onDisplayRefreshNeeded(const QString& fileIdentity);
    
    // Martin Fowler重构：移除重复的右键菜单槽函数声明
    // 这些功能已经由CustomFileListWidget的FileListContextMenu实现

private:
    void setupUI();
    void connectSignals();

    // 数据转换方法
    UnifiedFileInfo convertToUnifiedFileInfo(const UnifiedFileInfo& fileInfo) const;
    UnifiedFileInfo convertFromUnifiedFileInfo(const UnifiedFileInfo& simpleInfo) const;
    FileType determineFileType(const QString& filePath) const;

    // 状态管理方法
    void resetToInitialState();

    // 总页数计算和通知
    void updateTotalDisplayPages();

    // Martin Fowler重构：导出可用性检查和通知（简化Observer模式）
    bool checkExportAvailability() const;
    void notifyExportAvailability();
    
    // 核心组件
    CustomFileListWidget* m_customFileList;
    
    // 数据管理
    QList<UnifiedFileInfo> m_files;  // 使用统一的文件信息格式
    int m_currentIndex;
    int m_mainWindowCurrentFile;
    UnifiedFileInfo m_globalSettings;
    
    // === 关键补充：后台任务追踪（防止删除时的竞态条件） ===
    QMap<QString, QPointer<FileProcessWorker>> m_activeWorkers;  // fileIdentity → worker映射
    QMutex m_workersMutex;  // 保护activeWorkers的互斥锁
    
    // 右键菜单
    FileListContextMenu* m_contextMenu;
    
    // 自适应窗口管理
    bool m_adaptiveMode = true;     // 是否启用自适应模式
    int m_minWidth = 100;           // 最小宽度调整为100px（与CustomFileItem::MIN_ITEM_WIDTH保持一致）
    int m_maxWidth = 800;           // 最大宽度
    
    // 辅助方法
    UnifiedFileInfo createFileInfo(const QString& filePath);
    QString generateFileIdentity(const QString& filePath) const;
    void connectContextMenuSignals();
    
    // === Martin Fowler重构：Extract Method - 统一的当前索引调整策略 ===
    int calculateNewCurrentIndexAfterDeletion(const QList<int>& deletedIndices, int currentIndex) const;

    // === Martin Fowler重构：删除操作专用的UI刷新（确保单选状态） ===
    void refreshUIAfterFileDeletion();

    // === 排序功能辅助方法 ===
    void applySortOrderByFileIdentity(const QList<int>& indices, bool naturalSort);  // 智能排序（保持文件状态）
    void applySortedOrder(const QList<int>& originalIndices, const QList<int>& sortedIndices);  // 旧版排序方法
    
    // Martin Fowler重构：移除重复的setupContextMenu方法声明
    // 右键菜单功能已委托给CustomFileListWidget的FileListContextMenu
};

#endif // CUSTOMFILEBROWSER_H